import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

class Solution4 {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        }
        PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((pair1, pair2)-> pair1.getValue() - pair2.getValue());
        for(Map.Entry<Integer,Integer> entry: map.entrySet()){
            if(pq.size()<k){
                pq.add(entry);
            }else {
                if(pq.peek().getValue() < entry.getValue()){
                    pq.poll();
                    pq.add(entry);
                }
            }
        }
        int[] res = new int[k];
        for(int i=0;i<k;i++){
            res[i]=pq.poll().getKey();
        }
        return res;
    }
}